/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.controlador;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import sv.com.intesal.clases.abstracts.ControladorEncaAbstract;
import sv.com.intesal.compra.bean.Linea;
import sv.com.intesal.compra.bean.Marca;
import sv.com.intesal.compra.bean.Producto;
import sv.com.intesal.compra.bean.ProductoSucursal;
import sv.com.intesal.compra.bean.SubLinea;
import sv.com.intesal.compra.bean.TipoProducto;
import sv.com.intesal.compra.bean.Unidad;
import sv.com.intesal.compra.sql.SQLProducto;
import sv.com.intesal.general.bean.Sucursal;
import sv.com.intesal.general.controlador.SucursalControlador;

/**
 *
 * @author ejerez
 */
public class ProductoControlador {

    private class Enca extends ControladorEncaAbstract {

        public void insert(Producto p) throws Exception {
            try {
                super.setEncaPreparedStatement(SQLProducto.ENCA.insert);
                super.ps_enca.setInt(1, p.getCodigo_sl());
                super.ps_enca.setInt(2, p.getCodigo_u());
                super.ps_enca.setInt(3, p.getCodigo_tp());
                super.ps_enca.setInt(4, p.getCodigo_m());
                super.ps_enca.setString(5, p.getCodigo_barra_p());
                super.ps_enca.setString(6, p.getCodigo_barra_original_p());
                super.ps_enca.setString(7, p.getNombre_p());
                super.ps_enca.setString(8, p.getDescripcion_p());
                super.ps_enca.setString(9, p.getOtra_informacion_p());
                super.ps_enca.setString(10, super.v.getEstado(p.getDescontar_inventario_filtro_p()));
                super.ps_enca.setString(11, super.v.getEstado(p.getEstado_filtro_p()));
                super.ps_enca.setDouble(12, p.getCosto_p());
                super.ps_enca.executeUpdate();
            } catch (Exception e) {
                throw new Exception(e);
            } finally {
                super.setCloseConexion();
            }
        }

        public void update(Producto p) throws Exception {
            try {
                super.setEncaPreparedStatement(SQLProducto.ENCA.update);
                super.ps_enca.setInt(1, p.getCodigo_sl());
                super.ps_enca.setInt(2, p.getCodigo_u());
                super.ps_enca.setInt(3, p.getCodigo_tp());
                super.ps_enca.setInt(4, p.getCodigo_m());
                super.ps_enca.setString(5, p.getCodigo_barra_p());
                super.ps_enca.setString(6, p.getCodigo_barra_original_p());
                super.ps_enca.setString(7, p.getNombre_p());
                super.ps_enca.setString(8, p.getDescripcion_p());
                super.ps_enca.setString(9, p.getOtra_informacion_p());
                super.ps_enca.setString(10, super.v.getEstado(p.getDescontar_inventario_filtro_p()));
                super.ps_enca.setString(11, super.v.getEstado(p.getEstado_filtro_p()));
                super.ps_enca.setDouble(12, p.getCosto_p());
                super.ps_enca.setInt(13, p.getCodigo_p());
                super.ps_enca.executeUpdate();
            } catch (Exception e) {
                throw new Exception(e);
            } finally {
                super.setCloseConexion();
            }
        }

        public Integer getMax() throws Exception {
            try {
                super.getEncaExecuteQuery(SQLProducto.ENCA.getMax);
                while (rs_enca.next()) {
                    return super.rs_enca.getInt("max");
                }
                return 0;
            } catch (Exception e) {
                throw new Exception(e);
            } finally {
                super.setCloseConexion();
            }
        }
    }

    private class Deta extends ControladorEncaAbstract {

        public void insert(Integer codigo_p, List<ProductoSucursal> lista) throws Exception {
            try {
                if (lista != null) {
                    for (int i = 0; i < lista.size(); i++) {
                        if (lista.get(i).getCodigo_p() == 0) {
                            System.out.println("insert= "+i);
                            this.insert(lista.get(i));
                        } else {
                            System.out.println("update= "+i);
                            this.update(lista.get(i));
                        }
                    }
                }
            } catch (Exception e) {
                throw new Exception(e);
            } finally {
                super.setCloseConexion();
            }
        }

        private void insert(ProductoSucursal ps) throws Exception {
            try {
                super.setDetaPreparedStatement(SQLProducto.DETA.insert);
                super.ps_deta.setInt(1, ps.getCodigo_s());
                super.ps_deta.setInt(2, ps.getCodigo_p());
                super.ps_deta.setInt(3, ps.getMinimo_ps());
                super.ps_deta.setInt(4, ps.getMaximo_ps());
                super.ps_deta.setDouble(5, ps.getExistencia_ps());
                super.ps_deta.setString(6, ps.getUbicacion_ps());
                super.ps_deta.setString(7, super.v.getEstado(ps.getEstado_filtro_ps()));
                super.ps_deta.executeUpdate();
            } catch (Exception e) {
                throw new Exception(e);
            } finally {
                super.setCloseConexion();
            }
        }

        private void update(ProductoSucursal ps) throws Exception {
            try {
                super.setDetaPreparedStatement(SQLProducto.DETA.update);
                super.ps_deta.setInt(1, ps.getCodigo_s());
                super.ps_deta.setInt(2, ps.getCodigo_p());
                super.ps_deta.setInt(3, ps.getMinimo_ps());
                super.ps_deta.setInt(4, ps.getMaximo_ps());
                super.ps_deta.setDouble(5, ps.getExistencia_ps());
                super.ps_deta.setString(6, ps.getUbicacion_ps());
                super.ps_deta.setString(7, super.v.getEstado(ps.getEstado_filtro_ps()));
                super.ps_deta.setInt(8, ps.getCodigo_ps());                
                super.ps_deta.executeUpdate();
            } catch (Exception e) {
                throw new Exception(e);
            } finally {
                super.setCloseConexion();
            }
        }
    }

    private class Consulta extends ControladorEncaAbstract {

        public List<Producto> getConsultaProductosActivos(Producto p) throws Exception {
            List<Producto> lista = new ArrayList<Producto>();
            Filtro f = new Filtro();

            try {
                String sql = SQLProducto.Consulta.getProductosActivos;
                sql += f.getFiltro_Linea(p) + f.getFiltro_SubLinea(p) + f.getFiltro_Marca(p) + f.getFiltro_TipoProducto(p) + f.getFiltro_Unidad(p) + f.getFiltro_Sucursal(p);
                sql += SQLProducto.Consulta.getProductosOrderBy;

                super.getEncaExecuteQuery(sql);

                Producto pr = null;
                while (super.rs_enca.next()) {
                    pr = this.getProducto(super.rs_enca);
                    pr.setProductoSucursales(this.getProductoSucursalesActivos(pr.getCodigo_p(), p.getProductoSucursales().get(0).getCodigo_s()));
                    lista.add(pr);
                }
                return lista;
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        public List<Producto> getQuickProductos() throws Exception {
            List<Producto> lista = new ArrayList<Producto>();
            try {
                super.getEncaExecuteQuery(SQLProducto.Consulta.getProductos + SQLProducto.Consulta.getProductosOrderBy);
                while (super.rs_enca.next()) {
                    Producto p = this.getProducto(super.rs_enca);
                    p.setProductoSucursales(this.getProductoSucursales(p.getCodigo_p()));
                    lista.add(p);
                }
                return lista;
            } catch (Exception e) {
                throw new Exception(e);
            } finally {
                super.setCloseConexion();
            }
        }

        private Producto getProducto(ResultSet rs) throws Exception {
            try {
                Producto p = new Producto();
                p.setCodigo_p(rs.getInt("codigo_p"));
                p.setNombre_p(rs.getString("nombre_p"));
                p.setDescripcion_p(rs.getString("descripcion_p"));
                p.setOtra_informacion_p(rs.getString("otra_informacion_p"));
                p.setCodigo_barra_p(rs.getString("codigo_barra_p"));
                p.setCodigo_barra_original_p(rs.getString("codigo_barra_original_p"));

                p.setDescontar_inventario_p(rs.getString("descontar_inventario_p"));
                p.setDescontar_inventario_filtro_p(v.getEstado(rs.getString("descontar_inventario_p")));

                p.setEstado_p(rs.getString("estado_p"));
                p.setEstado_filtro_p(v.getEstado(rs.getString("estado_p")));

                p.setCodigo_tp(rs.getInt("codigo_tp"));
                p.setNombre_tp(rs.getString("nombre_tp"));

                p.setCodigo_m(rs.getInt("codigo_m"));
                p.setNombre_m(rs.getString("nombre_m"));

                p.setCodigo_u(rs.getInt("codigo_u"));
                p.setNombre_u(rs.getString("nombre_u"));

                p.setCodigo_l(rs.getInt("codigo_l"));
                p.setNombre_l(rs.getString("nombre_l"));

                p.setCodigo_sl(rs.getInt("codigo_sl"));
                p.setNombre_sl(rs.getString("nombre_sl"));

                p.setCodigo_tp(rs.getInt("codigo_tp"));
                p.setNombre_tp(rs.getString("nombre_tp"));

                p.setExistencia_total_p(rs.getDouble("total"));
                p.setCosto_p(rs.getDouble("costo_p"));
                //p.setProductoSucursales(this.getProductoSucursales(p.getCodigo_p()));
                return p;
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        private List<ProductoSucursal> getProductoSucursales(Integer codigo_p) throws Exception {
            List<ProductoSucursal> lista = new ArrayList<ProductoSucursal>();
            try {
                super.setDetaPreparedStatement(SQLProducto.Consulta.getProductoSucursales);
                super.ps_deta.setInt(1, codigo_p);
                super.getDetaExecuteQuery(ps_deta);

                while (super.rs_deta.next()) {
                    lista.add(this.getProductoSucursal(super.rs_deta));
                }
                return lista;
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        private List<ProductoSucursal> getProductoSucursalesActivos(Integer codigo_p, Integer codigo_s) throws Exception {
            List<ProductoSucursal> lista = new ArrayList<ProductoSucursal>();
            try {
                super.setDetaPreparedStatement(SQLProducto.Consulta.getProductoSucursalesActivos);
                super.ps_deta.setInt(1, codigo_p);
                super.ps_deta.setInt(2, codigo_s);

                super.getDetaExecuteQuery(ps_deta);

                while (super.rs_deta.next()) {
                    lista.add(this.getProductoSucursal(super.rs_deta));
                }
                return lista;
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        private ProductoSucursal getProductoSucursal(ResultSet rs) throws Exception {
            try {
                /*PRODUCTO_SUCURSAL*/
                ProductoSucursal ps = new ProductoSucursal();
                ps.setCodigo_ps(rs.getInt("codigo_ps"));
                ps.setCodigo_p(rs.getInt("codigo_p"));
                ps.setMaximo_ps(rs.getInt("maximo_ps"));
                ps.setMinimo_ps(rs.getInt("minimo_ps"));
                ps.setUbicacion_ps(rs.getString("ubicacion_ps"));
                ps.setExistencia_ps(rs.getDouble("existencia_ps"));
                ps.setEstado_ps(rs.getString("estado_ps"));
                ps.setEstado_filtro_ps(v.getEstado(rs.getString("estado_ps")));

                /*SUCURSAL*/
                ps.setCodigo_s(rs.getInt("codigo_s"));
                ps.setNombre_s(rs.getString("nombre_s"));
                return ps;
            } catch (Exception e) {
                throw new Exception(e);
            }
        }
    }

    private class Filtro {

        public String getFiltro_Linea(Producto p) {
            try {
                String var_filtro = " ";

                if (p.getEstado_filtro_l() == true) {
                    var_filtro = " and l.codigo_l=" + p.getCodigo_l() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return " ";
            }
        }

        public String getFiltro_SubLinea(Producto p) {
            try {
                String var_filtro = " ";

                if (p.getEstado_filtro_sl() == true) {
                    var_filtro = " and sl.codigo_sl=" + p.getCodigo_sl() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return " ";
            }
        }

        public String getFiltro_Marca(Producto p) {
            try {
                String var_filtro = " ";

                if (p.getEstado_filtro_m() == true) {
                    var_filtro = " and m.codigo_m=" + p.getCodigo_m() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return " ";
            }
        }

        public String getFiltro_TipoProducto(Producto p) {
            try {
                String var_filtro = " ";

                if (p.getEstado_filtro_tp() == true) {
                    var_filtro = " and tp.codigo_tp=" + p.getCodigo_tp() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return " ";
            }
        }

        public String getFiltro_Unidad(Producto p) {
            try {
                String var_filtro = " ";

                if (p.getEstado_filtro_u() == true) {
                    var_filtro = " and u.codigo_u=" + p.getCodigo_u() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return " ";
            }
        }

        public String getFiltro_Sucursal(Producto p) {
            try {
                String var_filtro = " ";

                if (p.getProductoSucursales().get(0).getEstado_filtro_s() == true) {
                    var_filtro = " and ps.codigo_s=" + p.getProductoSucursales().get(0).getCodigo_s() + " ";
                }
                return var_filtro;
            } catch (Exception e) {
                return " ";
            }
        }
    }

    public class ComboBox {

        public List<Marca> getMarcasActivos() throws Exception {
            try {
                MarcaControlador mc = new MarcaControlador();
                return mc.getMarcasActivos();
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        public List<TipoProducto> getTipoProductosActivos() throws Exception {
            try {
                TipoProductoControlador tp = new TipoProductoControlador();
                return tp.getTipoProductosActivos();
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        public List<Unidad> getUnidadesActivos() throws Exception {
            try {
                UnidadControlador uc = new UnidadControlador();
                return uc.getUnidadesActivos();
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        public List<Linea> getLineas() throws Exception {
            try {
                SubLineaControlador sl = new SubLineaControlador();
                return sl.getLineasActivos();
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        public List<SubLinea> getSubLineas(Integer codigo_l) throws Exception {
            try {
                SubLineaControlador sl = new SubLineaControlador();
                return sl.getSubLineaActivos_x_Linea(codigo_l);
            } catch (Exception e) {
                throw new Exception(e);
            }
        }

        public List<Sucursal> getSucursalesActivos() throws Exception {
            try {
                SucursalControlador sc = new SucursalControlador();
                return sc.getSucursalActivos();
            } catch (Exception e) {
                throw new Exception(e);
            }
        }
    }

    public void insert(Producto p, List<ProductoSucursal> lista) throws Exception {
        try {
            Enca en = new Enca();
            en.insert(p);

            Deta d = new Deta();
            d.insert(en.getMax(), lista);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void update(Producto p, List<ProductoSucursal> lista) throws Exception {
        try {
            Enca en = new Enca();
            en.update(p);

            Deta d = new Deta();
            d.insert(p.getCodigo_p(), lista);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Producto> getConsultaProductosActivos(Producto p) throws Exception {
        try {
            Consulta c = new Consulta();
            return c.getConsultaProductosActivos(p);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
